package models

import (
	"time"
)

// User 用户模型，对应数据库中的users表
type User struct {
	ID        uint      `gorm:"primaryKey;autoIncrement;type:bigint unsigned" json:"id"` // 主键，自增
	Username  string    `gorm:"type:varchar(50);uniqueIndex" json:"username"`            // 用户名，唯一索引
	Password  string    `gorm:"type:varchar(255)" json:"-"`                              // 密码，json序列化时忽略
	Email     string    `gorm:"type:varchar(100);uniqueIndex" json:"email"`              // 邮箱，唯一索引
	IsAdmin   bool      `gorm:"type:bool;default:false" json:"is_admin"`                 // 是否为管理员，默认false
	CreatedAt time.Time `json:"created_at"`                                              // 创建时间
	UpdatedAt time.Time `json:"updated_at"`                                              // 更新时间
}

// TableName 指定表名
func (User) TableName() string {
	return "users"
}

// UserRegisterRequest 用户注册请求结构体
type UserRegisterRequest struct {
	Username string `json:"username" binding:"required,min=3,max=20"` // 用户名，必填，3-20字符
	Password string `json:"password" binding:"required,min=6"`        // 密码，必填，最少6字符
	Email    string `json:"email" binding:"required,email"`           // 邮箱，必填，邮箱格式
}

// UserLoginRequest 用户登录请求结构体
type UserLoginRequest struct {
	Username string `json:"username" binding:"required"` // 用户名，必填
	Password string `json:"password" binding:"required"` // 密码，必填
}

// UserUpdateRequest 用户更新请求结构体（支持部分更新）
type UserUpdateRequest struct {
	Username *string `json:"username,omitempty" binding:"omitempty,min=3,max=20"` // 用户名，可选，3-20字符
	Password *string `json:"password,omitempty" binding:"omitempty,min=6"`        // 密码，可选，最少6字符
	Email    *string `json:"email,omitempty" binding:"omitempty,email"`           // 邮箱，可选，邮箱格式
}

// UserResponse 用户响应结构体（不包含密码）
type UserResponse struct {
	ID        uint      `json:"id"`
	Username  string    `json:"username"`
	Email     string    `json:"email"`
	IsAdmin   bool      `json:"is_admin"`
	CreatedAt time.Time `json:"created_at"`
}

// ToResponse 将User转换为UserResponse
func (u *User) ToResponse() *UserResponse {
	return &UserResponse{
		ID:        u.ID,
		Username:  u.Username,
		Email:     u.Email,
		IsAdmin:   u.IsAdmin,
		CreatedAt: u.CreatedAt,
	}
}
